package control;

import java.sql.SQLException;
import java.util.List;

import model.LinhaProjeto;
import model.Projeto;
import model.Requisicao;
import model.UsuarioCT;
import dao.ProjetoDAO;
import dao.UsuarioCTDAO;
import dao.UsuarioProjetoDAO;

public class SistemaFloappRep {
	
	private ProjetoDAO projetoDAO;
	private UsuarioCTDAO usuarioDAO;
	private UsuarioProjetoDAO usuarioProjetoDAO;
	
	public SistemaFloappRep() throws SQLException {
		this.projetoDAO = ProjetoDAO.getInstance();
		this.usuarioDAO = UsuarioCTDAO.getInstance();
		this.usuarioProjetoDAO = UsuarioProjetoDAO.getInstance();
	}
	
	public UsuarioCT login(UsuarioCT usuarioForm) throws SQLException {
		//UsuarioCTDAO dao = UsuarioCTDAO.getInstance();
		UsuarioCT usuarioCT = usuarioDAO.getUsuario(usuarioForm.getUsuario());
		
		if (usuarioCT != null && usuarioForm.getSenha().equals(usuarioCT.getSenha())) {
			return usuarioCT;
		}
		return null;
	}

	public void associaProjeto(String usuario, String nomeUnix, String tipo) throws SQLException {
		//UsuarioProjetoDAO dao = UsuarioProjetoDAO.getInstance();
		usuarioProjetoDAO.adicionaProjeto(usuario, nomeUnix, tipo, !UsuarioCT.PERTENCE);
	}

	public boolean ehAdministrador(String usuario, String nomeUnix) throws SQLException {
		//UsuarioProjetoDAO daoUP = UsuarioProjetoDAO.getInstance();
		return usuarioProjetoDAO.ehAdministrador(usuario,nomeUnix);
	}

	public Projeto pesquisaProjeto(String nomeUnix) throws SQLException {
		//ProjetoDAO dao = ProjetoDAO.getInstance();
		return projetoDAO.pesquisa(nomeUnix);
	}

	public void cadastraProjeto(UsuarioCT usuario, Projeto projeto) throws SQLException {
		
		//ProjetoDAO daoP = ProjetoDAO.getInstance();
		projetoDAO.adiciona(projeto);
		
		//UsuarioProjetoDAO daoUP = UsuarioProjetoDAO.getInstance();
		
		if (projeto.getServico())
			//Usuario criou um projeto para ser um servico do FLOApp, mas o servico
			//precisa ser autorizado pelo administador do FLOApp-Repositorio para funcionar.
			//Logo o atributo "pertence" eh setado para FALSE enquanto o admin nao autoriza.
			usuarioProjetoDAO.adicionaProjeto(usuario.getUsuario(),projeto.getNomeUnix(),UsuarioCT.ADMINISTRADOR,!UsuarioCT.PERTENCE);
		//Projeto normal
		else usuarioProjetoDAO.adicionaProjeto(usuario.getUsuario(),projeto.getNomeUnix(),UsuarioCT.ADMINISTRADOR,UsuarioCT.PERTENCE);
	}

	public List<Projeto> listaProjetos(String usuario) throws SQLException {
		//UsuarioProjetoDAO daoUP = UsuarioProjetoDAO.getInstance();
		//return usuarioProjetoDAO.listaLinhasProjetos(usuario);
		return projetoDAO.listaProjetos(usuario);
	}

	public List<Projeto> listaProjetos() throws SQLException {
		//ProjetoDAO daoP = ProjetoDAO.getInstance();
		return projetoDAO.pesquisa();
	}

	public void removeProjeto(String nomeUnix) throws SQLException {
		//ProjetoDAO daoP = ProjetoDAO.getInstance();
		projetoDAO.remove(nomeUnix);
		
	}

	public List<Projeto> listaProjetos(String usuario, String tipo) throws SQLException {
		//UsuarioProjetoDAO daoUP = UsuarioProjetoDAO.getInstance();
		return usuarioProjetoDAO.listaProjetos(usuario,tipo);
	}

	public List<Projeto> listaProjetosQueNaoPertence(String usuario) throws SQLException {
		//UsuarioProjetoDAO dao = UsuarioProjetoDAO.getInstance();
		return usuarioProjetoDAO.listaProjetosQueNaoPertence(usuario);
	}

	public List<Requisicao> listaRequisicoes(String usuario) throws SQLException {
		//UsuarioProjetoDAO daoUP = UsuarioProjetoDAO.getInstance();
		return usuarioProjetoDAO.listaRequisicoes(usuario);
	}

	public void alteraProjeto(Projeto projeto) throws SQLException {
		//ProjetoDAO dao = ProjetoDAO.getInstance();
		projetoDAO.altera(projeto);
		
	}

	public void removeUsuarioRequisicao(String usuario, String nomeUnix) throws SQLException {
		//daoUP = UsuarioProjetoDAO.getInstance();
		usuarioProjetoDAO.remove(usuario, nomeUnix);
	}

	public void aceitaUsuarioRequisicao(String usuario, String nomeUnix, boolean valor) throws SQLException {
		usuarioProjetoDAO.alteraRequisicao(usuario, nomeUnix, true);
	}

	public void cadastrarUsuario(UsuarioCT usuario) throws SQLException {
		usuarioDAO.adiciona(usuario);
	}
	
	public void removerUsuario(UsuarioCT usuario) throws SQLException {
		usuarioDAO.remove(usuario);
	}
}
